package com.xlh.proxy.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

//专门负责计时的调用处理器对象，
//该调用处理器当中编写计时相关的代码，
//这个调用处理器写一个就好了
public class TimerInvocationHandler implements InvocationHandler {
    private Object target;
    public TimerInvocationHandler(Object target) {
        //赋值给成员变量
        this.target = target;
    }
/*
    1 为什么要强行要求你实现Inv接口
      因为一个类实现接口就必须要实现接口中的方法，
      以下这个方法必须要满足invoke，因为jdk底层调用了invoke方法的程序已经提前写好了
      注意：invoke方法不是我们负责调用的，是jdk负责的
    2 invoke什么时候被调用呢
      当代理对象调用代理方法时，注册在Inv调用处理器当中的invoke方法被调用
    3 invoke的三个参数
      第一个参数，Object proxy 代理对象的调用，使用较少
      第二个参数，Method method 目标对象的目标方法，要执行的目标方法就是它
      第三个参数，Object[] args 目标方法上的实参，
     */

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //编写增强代码
        long start = System.currentTimeMillis();
        //调用目标对象的目标方法
        //方法四要素：哪个对象，哪个方法，传什么参数，返回什么值
        Object result = method.invoke(target, args);
        long end = System.currentTimeMillis();
        System.out.println("耗时时间" + (end - start) + "毫秒");
        //注意这个invoke方法的返回值，如果代理对象调用方法之后，需要返回值的话
        //invoke方法必须将目标对象的目标方法执行结果返回
        return result;
    }
}
